using Microsoft.AspNetCore.Mvc;     // 因为ControllerBase等需要引入
using MyWebApi.Api.Entity;      // 因为Users表需要引入
using System.Collections.Generic;   // 因为泛型需要引入
using System.Linq;     // 因为Where 引入之后我们可以使用一种类似SQL的语法来查询任何形式的数据
using System;
using MyWebApi.Api.Repository;
using MyWebApi.Api.ParamModel;
using MyWebApi.Api.Utils;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Authorization;

namespace MyWebApi.Api.Controllers
{
    // 特性
    // [Authorize]  // [Authorize]下的所有Api接口如：查询、删除、创建用户不能匿名访问，需要Token令牌才可访问
    [ApiController]
    [Route("[controller]")]

    public class UsersController : ControllerBase
    {

        // 实例化数据库
        // private MyWebApi.Api.Db.MyWebApiDb db = new Db.MyWebApiDb();

        // 定义为IRepository<T>的泛型接口未知数 T 为 Users
        private IRepository<Users> _usersRespository;   // 现在_usersRespository里包含IRepository<T>泛型接口里面的属性(可以使用这些属性来进行对Users表的操作)

        private TokenParameter _tokenParameter;

        private readonly IConfiguration _configuration;


        // 一个构造函数：初始化UsersController控制器，使该控制器一开始就有以下的属性
        public UsersController(IConfiguration configuration, IRepository<Users> usersRespository)
        {
            _configuration = configuration;
            _tokenParameter = _configuration.GetSection("tokenParameter").Get<TokenParameter>();

            _usersRespository = usersRespository;
        }

        // 查询所有用户
        [HttpGet]
        public dynamic Get([FromQuery] Pager pager)
        {
            var pageIndex = pager.pageIndex;
            var pageSize = pager.pageSize;

            // 查询所有用户
            var users = _usersRespository.Table.Where(x =>
                       x.IsDeleted != true
                 ).ToList();

            // Skip(第几条数据开始).Take(显示几条数据):从第几条数据开始显示几条数据，如Skip(2).Take(2),从第二条数据开始显示2条数据
            var u = users.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();     // 这边的解释是从(pageIndex-1)*pageSize开始显示pageSize条数据，pageIndex是当前的页面，pageSize是一个页面总共有的数据条数

            // 测试文件test.http需要
            // var users = GetUsers();
            var res = new
            {
                Code = 1000,
                Data = new { data = u, pager = new { pageIndex, pageSize, rowsTotal = users.Count() } },
                Msg = "获取用户列表成功"
            };
            return JsonHelper.Serialize(res);
        }

        // 根据id查用户
        [HttpPost, Route("select")]
        public dynamic postSelectUser(UserModel selectUser)
        {
            // 使用Contains(x)进行模糊查询
            var user = _usersRespository.Table.Where(x => x.UserName.Contains(selectUser.selectUser));

            if (user == null)
            {
                // 指定id用户不存在

                // 测试文件test.http需要
                // var users = GetUsers();
                // var user = users.Where(x => x.Id == id).FirstOrDefault();
                return new
                {
                    Code = 1001,
                    Data = user,
                    Msg = "指定id用户不存在"
                };
            }
            else
            {
                // 测试文件test.http需要
                // var users = GetUsers();
                // var user = users.Where(x => x.Id == id).FirstOrDefault();
                return new
                {
                    Code = 1000,
                    Data = user,
                    Msg = "查询指定用户成功"
                };
            }


        }

        // 创建用户
        [AllowAnonymous]    // 该Api接口可以不用令牌匿名访问
        [HttpPost]
        public dynamic Post(UserModel model)
        {     // model 储存数据的参数 q

            // 查询所有用户
            var users = _usersRespository.Table;

            var filterUser = users.Where(x =>
                       x.UserName == model.UserName
                 ).ToList();

            if (string.IsNullOrEmpty(model.Remark))
            {
                model.Remark = "暂无";
            }
            else
            {
                model.Remark = model.Remark;
            }

            if (filterUser.Count == 0)
            {
                // 没有重复的用户名数据，存进数据库
                var user = new Users
                {
                    UserName = model.UserName,
                    Password = model.Password,
                    Jurisdiction = 1,   // 1 为普通用户
                    Remark = model.Remark,
                };

                _usersRespository.Insert(user);

                // 测试文件test.http需要
                var res = new
                {
                    Code = 1000,
                    Data = model,
                    Msg = "创建用户成功"
                };
                return JsonHelper.Serialize(res);
            }
            else
            {
                // 用户名重复，报错误码到前端，前端处理
                var res = new
                {
                    Code = 1001,
                    Msg = "创建用户失败,用户名重复"
                };
                return JsonHelper.Serialize(res);
            }

        }


        // 根据id修改用户
        [HttpPut("{id}")]
        public dynamic Put(int id, UserModel model)
        {

            // 根据id修改密码
            if (model.Password != null)
            {
                // 查询user表里面id为传入值的数据
                var user = _usersRespository.GetById(id);
                // 修改密码
                user.Password = model.Password;
                // 修改更新时间
                user.UpdatedTime = DateTime.Now;
                // 保存进数据库
                _usersRespository.Update(user);
                var res = new
                {
                    Code = 1000,
                    Data = user,
                    Msg = string.Format("修改id为：{0} 的用户密码成功", id)
                };
                return JsonHelper.Serialize(res);
            }
            else
            {
                // 修改用户
                // 要修改的用户名是否存在
                var users = _usersRespository.Table;
                var filterUser = users.Where(x =>
                           x.UserName == model.UserName
                     ).ToList();

                if (filterUser.Count == 0)
                {
                    var user = _usersRespository.GetById(id);

                    if (user != null)
                    {
                        user.UserName = model.UserName;
                        user.Remark = model.Remark;
                        user.UpdatedTime = DateTime.Now;

                        _usersRespository.Update(user);

                        var webData = new { user.UserName, user.Remark, user.Id, user.CreatedTime, user.UpdatedTime };
                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1000,
                            Data = webData,
                            Msg = string.Format("修改id为：{0} 的用户", id)
                        };
                        return JsonHelper.Serialize(res);
                    }
                    else
                    {

                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1001,
                            Msg = string.Format("修改id为：{0} 的用户失败,用户不存在", id)
                        };
                        return JsonHelper.Serialize(res);
                    }

                }
                else if (filterUser[0].Id == id)
                {
                    var user = _usersRespository.GetById(id);

                    if (user != null)
                    {
                        user.UserName = model.UserName;
                        user.Remark = model.Remark;
                        user.UpdatedTime = DateTime.Now;

                        _usersRespository.Update(user);

                        var webData = new { user.UserName, user.Remark, user.Id, user.CreatedTime, user.UpdatedTime };
                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1000,
                            Data = webData,
                            Msg = string.Format("修改id为：{0} 的用户", id)
                        };
                        return JsonHelper.Serialize(res);
                    }
                    else
                    {

                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1001,
                            Msg = string.Format("修改id为：{0} 的用户失败,用户不存在", id)
                        };
                        return JsonHelper.Serialize(res);
                    }
                }
                else
                {

                    // 测试文件test.http需要
                    var res = new
                    {
                        Code = 1001,
                        Msg = string.Format("修改id为：{0} 的用户失败,用户名重复", id)
                    };
                    return JsonHelper.Serialize(res);
                }
            }





        }

        // 根据id删除用户
        [HttpPost("{id}")]
        public dynamic putDe(int id)
        {
            // 查询该id是否存在
            var user = _usersRespository.GetById(id);

            if (user != null)
            {
                user.IsDeleted = true;
                user.UpdatedTime = DateTime.Now;
                _usersRespository.Update(user);

                // 测试文件需要
                return new
                {
                    Code = 1000,
                    Msg = string.Format("删除id为:{0} 用户成功", id)
                };
            }
            else
            {
                // 测试文件需要
                return new
                {
                    Code = 1001,
                    Msg = string.Format("删除id为:{0} 用户失败，用户不存在", id)
                };
            }

        }




        // 判断登录，登录成功并生成token接口
        [AllowAnonymous]    // 该Api接口可以不用令牌匿名访问
        [HttpPost, Route("token")]
        public dynamic GetToken(UserModel model)
        {     // model 储存数据的参数

            var userName = model.UserName.Trim();
            var password = model.Password.Trim();

            var user = _usersRespository.Table.Where(x => x.UserName == userName && x.Password == password).FirstOrDefault();
            if (user != null)
            {
                // 判断是普通用户还是管理员登录(1为普通用户，2为管理员)
                if (user.Jurisdiction == 1)
                {
                    // 普通用户登录
                    if (user == null)
                    {
                        // 账号不存在
                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1001,
                            Data = user,
                            Msg = "用户账号或密码不正确，请重新输入"
                        };
                        return JsonHelper.Serialize(res);
                    }
                    else
                    {
                        // 账号存在，登录成功

                        // 使用生成Token的方法
                        var token = TokenHelper.GenerateToken(_tokenParameter, user);
                        var refreshToken = 123456;

                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1000,
                            Data = new { Token = token, RefreshToken = refreshToken },
                            Msg = "用户登录成功，保存Token"
                        };
                        return JsonHelper.Serialize(res);
                    }
                }
                else
                {
                    // 管理员登录
                    if (user == null)
                    {
                        // 账号不存在
                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1001,
                            Data = user,
                            Msg = "用户账号或密码不正确，请重新输入"
                        };
                        return JsonHelper.Serialize(res);
                    }
                    else
                    {
                        // 账号存在，登录成功

                        // 使用生成Token的方法
                        var token = TokenHelper.GenerateToken(_tokenParameter, user);
                        var refreshToken = 123456;

                        // 测试文件test.http需要
                        var res = new
                        {
                            Code = 1000,
                            Data = new { Token = token, RefreshToken = refreshToken },
                            Msg = "管理员登录成功，保存Token"
                        };
                        return JsonHelper.Serialize(res);
                    }
                }
            }
            else
            {
                // 测试文件test.http需要
                var res = new
                {
                    Code = 1001,
                    Data = "用户不存在",
                    Msg = "用户不存在，请先注册哦"
                };
                return JsonHelper.Serialize(res);
            }





        }


    }
}